/*
 * texture.c
 */
#include <farl.h>
#include <pio.h>
#include "funcdecl.h"
#include "vardecl.h"

/*
========================================
  テクスチャをバッファへ転送

  addr: テクスチャデータのアドレス
  bank: 転送するバンク
========================================
*/
void
SetTexture(unsigned short *addr, int bank)
{
  int x, y;
      
  FarlSetMemReg(FARL_CMT_BANK_SELECT_REG, bank);
  for (y = 0; y < 256; y++)
    for (x = 0; x < 256; x++)
      FarlWriteTxtXYUnpk(x, y, *(addr + x + y * 256));
}

/* 
========================================
  パックトテクスチャをバッファへ転送

  addr: テクスチャデータのアドレス
  bank: 転送するバンク
========================================
*/
void
SetPackedTexture(unsigned short *addr, int bank)
{
  int x, y;
      
  FarlSetMemReg(FARL_CMT_BANK_SELECT_REG, bank);
  for (y = 0; y < 256; y++)
    for (x = 0; x < 256; x++)
      FarlWriteTxtXY(x, y, *(addr + x + y * 256));
}

 
/* 
========================================
  オブジェクトデータ中のテクスチャバンク動的切り替え

  objAddr: 書き換えるオブジェクトデータ先頭アドレス
  bankOffsetTable: 参照テクスチャバンクを書き換える
                   オブジェクトデータ先頭アドレスからの
                   オフセットテーブル
  bank: このバンク用に書き換える

  書き換えられる参照テクスチャバンクのデータは相対的に書き換えるため
  0/1 でなければならない
========================================
*/
void
SetTextureBank(unsigned short *objAddr, int *bankOffsetTable, int bank)
{
  int i;

  for (i = 0; bankOffsetTable[i] != -1; i++) {
    /* 
     * テクスチャバンク書き換えに対して正しいデータかどうか確かめる
     */
    if (objAddr[bankOffsetTable[i] + 1] > 7) {
      pio_putstr("illegal bank value ");
      pio_putstr(ultoh((unsigned long)&objAddr[bankOffsetTable[i] + 1]));
      pio_putstr(" (");
      pio_putstr(ultoh(objAddr[bankOffsetTable[i] + 1]));
      pio_putstr(")\n");
      _exit();
    }      
    /* まだ書き換えていなかったら書き換える */
    if (objAddr[bankOffsetTable[i] + 1] < TBANK_P1)
      objAddr[bankOffsetTable[i] + 1] += bank;
  }
}
